﻿// 402 聚会.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <queue>
#include <algorithm>
#include <memory.h>
using namespace std;

/*
http://oj.daimayuan.top/course/14/problem/663

小蜗和他的 n−1个同学住在同一个小镇上，这个小镇可以看成一张 n个顶点 m条边的有向简单图，顶点编号从 1到 n
，每位同学（包括小蜗）住在不同的顶点，其中小蜗家在 k号顶点。

所有同学周末要到小蜗家聚会，聚会结束后同学们都会回家。为了合理安排时间，
小蜗想要知道对于在路上来回花费时间最长的同学，他在路上要花费多少时间。

输入格式
第一行三个整数 n,m,k
，表示图的顶点数、边数，以及小蜗所在的顶点编号。

接下来 m行，每行三个整数 x,y,z
，表示 x号点到 y号点有一条有向边，通过这条边需要花费 z的时间。

数据保证所有点两两连通。

输出格式
输出一行一个数表示在路上来回花费时间最长的同学在路上花费了多少时间。

样例输入
3 4 2
1 2 3
2 1 2
2 3 2
3 2 4
样例输出
6
数据规模
对于所有数据，保证 2≤n≤100000,1≤m≤100000,1≤k≤n,1≤x,y≤n,1≤z≤10000。
*/

typedef pair<int, int> PII;
const int N = 100010, M = 100010;
int h[N], e[M], ne[M], w[M], idx;
int hr[N], er[M], ner[M], wr[M], idxr;
int dist[N], distr[N];
bool st[N], str[N];
int n, m, k;

void add(int a, int b, int c,int h[],int e[],int ne[],int w[],int* idx) {
	e[*idx] = b; w[*idx] = c, ne[*idx] = h[a], h[a] = (*idx); (*idx)++;
}

void dijkstrar(int xr) {
	memset(distr, 0x3f, sizeof distr);
	distr[xr] = 0;
	priority_queue<PII, vector<PII>, greater<PII>>  heapr;
	heapr.push({ 0,xr });

	while (!heapr.empty()) {
		auto t = heapr.top();
		heapr.pop();

		int ver = t.second, distance = t.first;

		if (str[ver]) continue;
		str[ver] = true;

		for (int i = hr[ver]; i != -1; i = ner[i]) {
			int j = er[i];
			if (distr[j] > distance + wr[i]) {
				distr[j] = distance + wr[i];
				heapr.push({ distr[j],j });
			}
		}
	}
	return;
}

void dijkstra(int x) {
	memset(dist, 0x3f, sizeof dist);
	dist[x] = 0;
	priority_queue<PII, vector<PII>, greater<PII>>  heap;
	heap.push({ 0,x });

	while (!heap.empty()) {
		auto t = heap.top();
		heap.pop();

		int ver = t.second, distance = t.first;

		if (st[ver]) continue;
		st[ver] = true;

		for (int i = h[ver]; i != -1; i = ne[i]) {
			int j = e[i];
			if (dist[j] > distance + w[i]) {
				dist[j] = distance + w[i];
				heap.push({ dist[j],j });
			}
		}
	}
	return;
}

int main()
{
	memset(h, -1, sizeof h);
	memset(hr, -1, sizeof hr);

	cin >> n >> m >> k;

	for (int i = 0; i < m; i++) {
		int a, b, c; cin >> a >> b >> c;
		add(a, b, c, h, e, ne, w, &idx);
		add(b, a, c, hr, er, ner, wr, &idxr);
	}

	dijkstra(k);
	dijkstrar(k);

	int ans = 0;

	for (int i = 1; i <= n; i++) {
		//printf("dist[%d] = %d, distr[%d] = %d\n",i,dist[i],i,distr[i]);
		ans = max(ans, dist[i] + distr[i]);
	}

	cout << ans << endl;


	return 0;
}

 